from graphviz import Digraph

# 创建一个有向图对象
dot = Digraph(comment='DFA Figure 1')
dot.attr(rankdir='LR') # 设置为从左到右布局，也可以不设置

# 1. 定义状态节点
#    - shape='doublecircle' 表示这是终态
dot.node('S', 'S')
dot.node('A', 'A')
dot.node('B', 'B')
dot.node('C', 'C')
dot.node('E', 'E', shape='doublecircle')

# 添加一个不可见的节点来画开始箭头
dot.node('start', '', shape='point')

# 2. 定义转换的有向边
dot.edge('start', 'S') # 开始状态箭头
dot.edge('S', 'B', label='0')
dot.edge('S', 'A', label='1')
dot.edge('A', 'C', label='1')
dot.edge('A', 'E', label='0')
dot.edge('B', 'C', label='0')
dot.edge('B', 'E', label='1')
dot.edge('C', 'B', label='0')
dot.edge('C', 'A', label='1')

# 3. 生成并保存图片
#    这会生成一个名为 'dfa_figure_1.gv' 的源文件和一个 'dfa_figure_1.gv.png' 的图片文件
dot.render('dfa_figure_1', format='png', view=True)

print("DFA 图已生成！")